// #include <memory>
// #include <iostream>

// class Parent;
// class Child {
// public:
//     std::shared_ptr<Parent> parent;  // 持有父节点的强引用
//     ~Child() { std::cout << "Child destroyed\n"; }
// };

// class Parent {
// public:
//     std::shared_ptr<Child> child;    // 持有子节点的强引用
//     ~Parent() { std::cout << "Parent destroyed\n"; }
// };

// // 问题：循环引用导致内存泄漏
// void circularReferenceProblem() {
//     auto parent = std::make_shared<Parent>();
//     auto child = std::make_shared<Child>();
    
//     parent->child = child;
//     child->parent = parent;  // 循环引用形成
    
//     // 即使函数结束，parent 和 child 也不会被销毁
//     // 因为它们的引用计数都大于0
// }

class Parent;
class Child {
public:
    std::shared_ptr<Parent> parent;
    ~Child() { std::cout << "Child destroyed\n"; }
};

class Parent {
public:
    std::weak_ptr<Child> child;  // 使用 weak_ptr 打破循环
    ~Parent() { std::cout << "Parent destroyed\n"; }
};

void circularReferenceSolution() {
    auto parent = std::make_shared<Parent>();
    auto child = std::make_shared<Child>();
    
    parent->child = child;  // weak_ptr 不增加引用计数
    child->parent = parent; // shared_ptr 增加引用计数
    
    // 现在当函数结束时，child 会被销毁（因为只有 parent 持有强引用）
    // parent 也会被销毁（因为没有其他强引用）
}